/**
 * 假如有编号为1~3的3张扑克牌和编号为1~3的3个盒子，现在需要将3张牌分别放到3个盒子中去，且每个盒子只能放
 * 一张牌，一共有多少种不同的放法
 */
public class Test {
    public static void dfs(int index, int n, int[] boxs, int[] book){
        if(index == n + 1){     //得到一种分配方法
            for (int i = 1; i <= n; i++) {
                System.out.print(boxs[i] + " ");
            }
            System.out.println();
            return;
        }
        for (int i = 1; i <= n; i++) {
            if(book[i] == 0){   //第i号牌仍在手上
                boxs[index] = i;
                book[i] = 1;    //现在第i号牌已经被用了
                Dfs(index + 1, n, boxs, book);
                //从下一个盒子回退到当前盒子，取出当前盒子的牌，
                //尝试放入其它牌。
                book[i] = 0;
            }
        }
    }

    public static void main(String[] args) {
        int n = 3;
        int[] boxs = new int[n+1];
        int[] book = new int[n+1];
        Dfs(1, n, boxs, book);
    }
}
